home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #047 (1990)(Amiga User Group Deutschland e.V.)[v Disaster Master 2].zip / Franz PD Disk #047 (1990)(Amiga User Group Deutschland e.V.)[v Disaster Master 2].adf / A68K_Beispiele / cmp.asm < prev    next >
Assembly Source File  |  1989-07-02  |  11KB  |  595 lines

  1. *****************************************
  2. *                    *
  3. * cmp - compare two files        *
  4. *                    *
  5. * written by E. Lenz            *
  6. *         Johann-Fichte-Strasse 11    *
  7. *         8 Munich 40        *
  8. *         Germany            *
  9. *                    *
  10. *****************************************
  11.  
  12.       XREF Disasm1
  13.  
  14. _AbsExecBase     equ 4
  15.  
  16. *****EXEC*******
  17.  
  18. _LVOForbid     equ -$84
  19. _LVOPermit     equ -$8a
  20. _LVOGetMsg     equ -$174
  21. _LVOReplyMsg     equ -$17a
  22. _LVOWaitPort     equ -$180
  23. _LVOCloseLibrary equ -$19e
  24.  
  25. _LVOOpenLibrary  equ -$228
  26.  
  27. *****DOS*****
  28.  
  29. _LVOOpen     equ -$1e
  30. _LVOClose     equ -$24
  31. _LVORead     equ -$2a
  32. _LVOWrite     equ -$30
  33.  
  34. pr_MsgPort     equ $5c
  35. pr_CLI         equ $ac
  36. ThisTask     equ $114
  37. VBlankFrequency  equ $212
  38. MODE_OLDFILE     equ 1005
  39.  
  40.      movea.l a0,a5           save instruction from CLI
  41.      move.l  d0,d4
  42.  
  43.      movea.l _AbsExecBase,a6   test if WB or CLI
  44.      movea.l ThisTask(a6),a0
  45.      tst.l     pr_CLI(a0)
  46.      bne.s     isCLI
  47.  
  48.      lea     pr_MsgPort(a0),a0 for WB get WB Message
  49.      jsr     _LVOWaitPort(a6)
  50.      jsr     _LVOGetMsg(a6)
  51.      move.l  d0,WBenchMsg
  52.      moveq     #1,d4           make sure there's no instruction
  53.  
  54. isCLI     cmpi.b  #60,VBlankFrequency(a6) test if PAL or NTSC
  55.      beq.s     isNTSC
  56.      move.l  #'256/',window+12
  57.  
  58. isNTSC     lea     dosname(pc),a1    open DOS library
  59.      moveq     #0,d0
  60.      jsr     _LVOOpenLibrary(a6)
  61.      move.l  d0,dosbase
  62.      beq.s     Gexit
  63.  
  64.      movea.l d0,a6           open Console window
  65.      move.l  #window,d1
  66.      move.l  #MODE_OLDFILE,d2
  67.      jsr     _LVOOpen(a6)
  68.      move.l  d0,conhandle
  69. Gexit     beq     exit
  70.  
  71.      subq.l  #1,d4
  72.      beq.s     noinst        no instruction from CLI
  73.  
  74.      lea     file1(pc),a0      transfer input file name
  75.      moveq     #0,d2
  76. trans1     move.b  (a5)+,d0
  77.      cmpi.b  #' ',d0
  78.      beq.s     toFile
  79.      move.b  d0,(a0)+
  80.      addq.l  #1,d2
  81.      subq.l  #1,d4
  82.      bne.s     trans1
  83.  
  84. toFile     move.b  #$a,(a0)+
  85.      move.l  d2,f1length
  86. toFile1  subq.l  #1,d4
  87.      beq.s     noinst
  88.      move.b  (a5)+,d0
  89.      cmpi.b  #' ',d0
  90.      beq.s     toFile1
  91.  
  92.      lea     file2(pc),a0
  93. trans2     move.b  d0,(a0)+
  94.      move.b  (a5)+,d0
  95.      addq.l  #1,f2length
  96.      cmpi.b  #$a,d0
  97.      beq.s     Parse
  98.      subq.l  #1,d4
  99.      bne.s     trans2
  100.  
  101.  
  102. noinst     move.l  conhandle(pc),d1  first file
  103.      move.l  #INF,d2
  104.      moveq     #INFE-INF,d3
  105.      jsr     _LVOWrite(a6)
  106.  
  107.      move.l  conhandle(pc),d1
  108.      move.l  #file1,d2
  109.      moveq     #60,d3
  110.      jsr     _LVORead(a6)
  111.      subq.l  #1,d0
  112.      move.l  d0,f1length
  113.  
  114.      move.l  conhandle(pc),d1  second file
  115.      move.l  #OUTF,d2
  116.      moveq     #OUTE-OUTF,d3
  117.      jsr     _LVOWrite(a6)
  118.  
  119.      move.l  conhandle(pc),d1
  120.      move.l  #file2,d2
  121.      moveq     #60,d3
  122.      jsr     _LVORead(a6)
  123.      subq.l  #1,d0
  124.      move.l  d0,f2length
  125.  
  126. Parse     lea     file1(pc),a0      zero behind strings
  127. Floop     cmpi.b  #$a,(a0)+
  128.      bne.s     Floop
  129.      clr.b     -(a0)
  130.  
  131.      lea     file2(pc),a0
  132. Gloop     cmpi.b  #$a,(a0)+
  133.      bne.s     Gloop
  134.      clr.b     -(a0)
  135.  
  136.      move.l  #file1,d1       open first file
  137.      move.l  #MODE_OLDFILE,d2
  138.      jsr     _LVOOpen(a6)
  139.      move.l  d0,InFile
  140.      beq.s     exit
  141.  
  142.      move.l  #file2,d1       open second file
  143.      move.l  #MODE_OLDFILE,d2
  144.      jsr     _LVOOpen(a6)
  145.      move.l  d0,OutFile
  146.      beq.s     exit
  147.  
  148.      move.l  f1length(pc),d0
  149.      lea     file1(pc),a0
  150.      move.b  #$a,0(a0,d0)
  151.  
  152.      move.l  f2length(pc),d0
  153.      lea     file2(pc),a0
  154.      move.b  #$a,0(a0,d0)
  155.  
  156.      moveq     #0,d4
  157.      clr.w     Micro
  158.  
  159.      bsr.s     Compare
  160.  
  161. exit     move.l  conhandle(pc),d1  close console
  162.      beq.s     FileIn
  163.      jsr     _LVOClose(a6)
  164.  
  165. FileIn     move.l  InFile(pc),d1     close input file
  166.      beq.s     noIn
  167.      jsr     _LVOClose(a6)
  168.  
  169. noIn     move.l  OutFile(pc),d1    close output file
  170.      beq.s     noOut
  171.      jsr     _LVOClose(a6)
  172.  
  173. noOut     move.l  _AbsExecBase,a6
  174.      move.l  WBenchMsg(pc),d7
  175.      beq.s     NoBench
  176.      jsr     _LVOForbid(a6)    reply to WB
  177.      movea.l d7,a1
  178.      jsr     _LVOReplyMsg(a6)
  179.      jsr     _LVOPermit(a6)
  180.  
  181. NoBench  move.l  dosbase(pc),a1    close dos.lib
  182.      jsr     _LVOCloseLibrary(a6)
  183.      moveq     #0,d0
  184.      rts
  185.  
  186. *****ROUTINES******
  187.  
  188. Compare  move.l  InFile(pc),d1     fill buffer
  189.      move.l  #Buffer2,d2
  190.      moveq     #80,d3
  191.      jsr     _LVORead(a6)
  192.      move.l  d0,BufNum2
  193.      move.l  NextRel(pc),RelAddr
  194.      add.l     d0,NextRel
  195.  
  196.      move.l  OutFile(pc),d1
  197.      move.l  #Inst,d2
  198.      moveq     #80,d3
  199.      jsr     _LVORead(a6)
  200.      cmp.l     BufNum2(pc),d0
  201.      bne.s     length
  202.      tst.l     d0
  203.      beq.s     issame
  204.  
  205.      lea     Buffer2(pc),a0
  206.      lea     Inst(pc),a1
  207.      subq.l  #1,d0
  208.      moveq     #0,d5
  209. cmpl1     addq.l  #1,d4
  210.      addq.l  #1,d5
  211.      cmpm.b  (a0)+,(a1)+
  212.      bne.s     differ
  213. cmplp     dbra     d0,cmpl1
  214.      bra.s     Compare
  215.  
  216. issame     tst.l     difr
  217.      bne.s     yyy
  218.      move.l  #same,d2
  219.      moveq     #22,d3
  220.      bra.s     xxx
  221.  
  222. length     move.l  #NoLength,d2
  223.      moveq     #16,d3
  224. xxx     move.l  conhandle(pc),d1  write message to console
  225.      jsr     _LVOWrite(a6)
  226. yyy     move.l  conhandle(pc),d1  wait until keypressed
  227.      move.l  #align2,d2
  228.      moveq     #2,d3
  229.      jsr     _LVORead(a6)
  230.  
  231.      rts
  232.  
  233. differ     movem.l d0/d4-d5/a0-a1,-(a7)
  234.      move.l  #1,difr
  235.      move.l  #diff,d2
  236.      moveq     #17,d3
  237.      move.l  conhandle(pc),d1  write message to console
  238.      jsr     _LVOWrite(a6)
  239.      move.l  #Hextxt,d6
  240.      subq.l  #1,d4
  241.      bsr     decout
  242.      bsr     hex
  243.      move.l  #ata,d2
  244.      moveq     #24,d3
  245.      move.l  conhandle(pc),d1  write message to console
  246.      jsr     _LVOWrite(a6)
  247.  
  248. ; ASCII difference
  249.  
  250.      move.l  #file1,d2
  251.      move.l  f1length(pc),d3
  252.      addq.l  #1,d3
  253.      move.l  conhandle(pc),d1
  254.      jsr     _LVOWrite(a6)
  255.      lea     Buffer2(pc),a0
  256.      bsr     Ascii
  257.  
  258.      move.l  #file2,d2
  259.      move.l  f2length(pc),d3
  260.      addq.l  #1,d3
  261.      move.l  conhandle(pc),d1
  262.      jsr     _LVOWrite(a6)
  263.      lea     Inst(pc),a0
  264.      bsr     Ascii
  265.  
  266. ; HEX difference
  267.  
  268.      move.l  #file1,d2
  269.      move.l  f1length(pc),d3
  270.      addq.l  #1,d3
  271.      move.l  conhandle(pc),d1
  272.      jsr     _LVOWrite(a6)
  273.      lea     Buffer2(pc),a1
  274.      bsr     HexOut
  275.  
  276.      move.l  #file2,d2
  277.      move.l  f2length(pc),d3
  278.      addq.l  #1,d3
  279.      move.l  conhandle(pc),d1
  280.      jsr     _LVOWrite(a6)
  281.      lea     Inst(pc),a1
  282.      bsr     HexOut
  283.  
  284. ; press key for disassembled
  285.  
  286.      move.l  #key,d2
  287.      moveq     #32,d3
  288.      move.l  conhandle(pc),d1
  289.      jsr     _LVOWrite(a6)
  290.  
  291.      move.l  conhandle(pc),d1  wait until keypressed
  292.      move.l  #OutBuf,d2
  293.      moveq     #2,d3
  294.      jsr     _LVORead(a6)
  295.  
  296. ; disassembled difference
  297.  
  298.      lea     file1(pc),a0
  299.      lea     OutBuf(pc),a1
  300.      moveq     #0,d0
  301.      move.l  f1length(pc),d1
  302.      subq.l  #1,d1
  303. tran1     move.b  (a0)+,(a1)+
  304.      addq.l  #1,d0
  305.      dbra     d1,tran1
  306. clr1     cmpi.l  #40,d0
  307.      bge.s     filetwo
  308.      move.b  #' ',(a1)+
  309.      addq.l  #1,d0
  310.      bra.s     clr1
  311. filetwo  lea     file2(pc),a0
  312.      move.l  f2length(pc),d1
  313. tran2     move.b  (a0)+,(a1)+
  314.      addq.l  #1,d0
  315.      dbra     d1,tran2
  316.  
  317.      move.l  #OutBuf,d2
  318.      move.l  d0,d3
  319.      move.l  conhandle(pc),d1
  320.      jsr     _LVOWrite(a6)
  321.  
  322.      move.l  #Buffer2,d4       begin file 1
  323.      move.l  #Inst,d6       begin file 2
  324.      move.l  RelAddr(pc),d7    relative address
  325.      move.l  d7,-(a7)
  326.  
  327. DisLp     lea     Begin(pc),a0
  328.      move.l  d4,(a0)
  329.      move.l  d7,RelAddr
  330.      jsr     Disasm1
  331.      move.l  Begin(pc),d4
  332.      move.l  RelAddr(pc),d7
  333.      lea     Buffer(pc),a0
  334.      lea     OutBuf(pc),a1
  335.      moveq     #6,d1
  336. rela     move.b  (a0)+,(a1)+
  337.      dbra     d1,rela
  338.      lea     Buffer+40,a0
  339.      moveq     #39,d1
  340. trns1     move.b  (a0)+,(a1)+
  341.      dbra     d1,trns1
  342.  
  343.      lea     Begin(pc),a0
  344.      move.l  d6,(a0)
  345.      jsr     Disasm1
  346.      move.l  Begin(pc),d6
  347.      lea     Buffer+40,a0
  348.      lea     OutBuf+40,a1
  349.      moveq     #28,d1
  350. trns2     move.b  (a0)+,(a1)+
  351.      dbra     d1,trns2
  352.      move.b  #$a,(a1)
  353.      sub.w     Total(pc),d5
  354.      bgt.s     WriteOut
  355.  
  356.      lea     invtext(pc),a0    invert line
  357.      lea     Out1(pc),a1
  358.      moveq     #8,d0
  359. invt1     move.b  (a0)+,(a1)+
  360.      dbra     d0,invt1
  361.      lea     Out2(pc),a1
  362.      moveq     #8,d0
  363. invt2     move.b  (a0)+,(a1)+
  364.      dbra     d0,invt2
  365.      move.b  #$a,(a1)
  366.      moveq     #100,d5
  367.      move.l  #Out1,d2
  368.      moveq     #88,d3
  369.      bra.s     ReWrite
  370.  
  371. WriteOut move.l  #OutBuf,d2
  372.      moveq     #70,d3
  373. ReWrite  move.l  conhandle(pc),d1
  374.      jsr     _LVOWrite(a6)
  375.  
  376.      cmpi.l  #align2,d4
  377.      blt     DisLp
  378.  
  379.      move.l  #yes,d2
  380.      moveq     #30,d3
  381.      move.l  conhandle(pc),d1  write message to console
  382.      jsr     _LVOWrite(a6)
  383.  
  384.      move.l  conhandle(pc),d1  wait until keypressed
  385.      move.l  #align2,d2
  386.      moveq     #2,d3
  387.      jsr     _LVORead(a6)
  388.  
  389.      move.l  (a7)+,RelAddr
  390.      movem.l (a7)+,d0/d4-d5/a0-a1
  391.      move.b  align2(pc),d1
  392.      cmpi.b  #'y',d1
  393.      beq.s     Gcmp
  394.      cmpi.b  #'Y',d1
  395. Gcmp     beq     cmplp
  396.  
  397.      rts
  398.  
  399.  
  400. ; decimal  output
  401.  
  402. decout     move.l  d4,-(a7)
  403.      lea     OutBuf(pc),a0
  404.      moveq     #0,d0
  405. wrlop     andi.l  #$ffff,d4
  406.      tst.l     d4
  407.      beq.s     back
  408.      divu     #10,d4
  409.      swap     d4
  410.      move.b  d4,(a0)+
  411.      swap     d4
  412.      addq.l  #1,d0
  413.      bra.s     wrlop
  414.  
  415. back     tst.l     d0              zero is a special case
  416.      bne.s     bakk
  417.      addq.l  #1,d0
  418.      clr.b     OutBuf
  419. bakk     movea.l d6,a0
  420.      moveq     #6,d1
  421.      subq.l  #1,d0
  422. clr     cmp.l     d0,d1
  423.      beq.s     endclr
  424.      move.b  #' ',-(a0)
  425.      subq.l  #1,d1
  426.      bra.s     clr
  427.  
  428. endclr     lea     OutBuf(pc),a1
  429. rewlop     move.b  (a1)+,d1
  430.      addi.b  #'0',d1
  431.      move.b  d1,-(a0)
  432.      dbra     d0,rewlop
  433.      move.l  (a7)+,d4
  434.      rts
  435.  
  436. ; HEX output
  437.  
  438. hex     lea     hex1(pc),a0
  439.      move.l  d4,d0
  440.      andi.l  #$f000,d0
  441.      lsr.l     #8,d0
  442.      lsr.l     #4,d0
  443.      bsr.s     byte
  444.      andi.l  #$f00,d0
  445.      lsr.l     #8,d0
  446.      bsr.s     byte
  447. real     move.l  d4,d0
  448.      andi.l  #$f0,d0
  449.      lsr.l     #4,d0
  450.      bsr.s     byte
  451.      andi.l  #$f,d0
  452.  
  453. byte     cmpi.b  #9,d0
  454.      ble.s     bok
  455.      addq.l  #7,d0
  456. bok     addi.l  #'0',d0
  457.      move.b  d0,(a0)+
  458.      move.l  d4,d0
  459.      rts
  460.  
  461. ; write Ascii
  462.  
  463. Ascii     lea     OutBuf(pc),a1
  464.      moveq     #79,d1
  465.      move.l  d5,-(a7)
  466. Asc1     move.b  (a0)+,d0             get byte
  467.      move.b  d0,d2
  468.      andi.b  #$7f,d2
  469.      cmpi.b  #$20,d2
  470.      bge.s     isok
  471.      moveq     #$2e,d0
  472. isok     subq.l  #1,d5
  473.      bne.s     nextAsc
  474.      bsr.s     invert
  475. nextAsc  move.b  d0,(a1)+             write ASCII
  476.      dbra     d1,Asc1
  477.      move.l  (a7)+,d5
  478.      move.b  #$a,(a1)
  479.      move.l  #OutBuf,d2
  480.      moveq     #99,d3
  481.      move.l  conhandle(pc),d1
  482.      jsr     _LVOWrite(a6)
  483.      rts
  484.  
  485. invert     movem.l d1/a0,-(a7)
  486.      lea     invtext(pc),a0
  487.      moveq     #8,d1
  488. inv1     move.b  (a0)+,(a1)+
  489.      dbra     d1,inv1
  490.      move.b  d0,(a1)+
  491.      moveq     #7,d1
  492. inv2     move.b  (a0)+,(a1)+
  493.      dbra     d1,inv2
  494.      move.b  (a0),d0
  495.      movem.l (a7)+,d1/a0
  496.      rts
  497.  
  498. ; write Hex
  499.  
  500. HexOut     lea     OutBuf(pc),a0
  501.      moveq     #79,d1
  502.      moveq     #0,d4
  503.      move.l  d5,-(a7)
  504. Hex1     move.b  (a1)+,d4             get byte
  505.      subq.l  #1,d5
  506.      bne.s     nextHex
  507.      bsr.s     invh
  508.      bra.s     nexth
  509. nextHex  bsr     real
  510. nexth     dbra     d1,Hex1
  511.      move.l  (a7)+,d5
  512.      move.b  #$a,(a0)
  513.      move.l  #OutBuf,d2
  514.      move.l  #179,d3
  515.      move.l  conhandle(pc),d1
  516.      jsr     _LVOWrite(a6)
  517.      rts
  518.  
  519. invh     movem.l d1/a1,-(a7)
  520.      lea     invtext(pc),a1
  521.      moveq     #8,d1
  522. inv3     move.b  (a1)+,(a0)+
  523.      dbra     d1,inv3
  524.      bsr     real
  525.      moveq     #8,d1
  526. inv4     move.b  (a1)+,(a0)+
  527.      dbra     d1,inv4
  528.      movem.l (a7)+,d1/a1
  529.      rts
  530.  
  531. dosbase    dc.l 0
  532. conhandle  dc.l 0
  533. InFile       dc.l 0
  534. OutFile    dc.l 0
  535. WBenchMsg  dc.l 0
  536. NextRel    dc.l 0
  537. difr       dc.l 0
  538.  
  539. key       dc.b $a,' press RETURN for disassembled',$a
  540. yes       dc.b $a,' press Y for next difference',$a
  541.  
  542. invtext    dc.b $9b,'0;31;43',$6d,$9b,'0;31;40',$6d
  543.  
  544. NoLength   dc.b 'different length'
  545. same       dc.b 'the files are the same'
  546. diff       dc.b 'the files differ',$a
  547. ata       dc.b 'at  FFFFFF'
  548. Hextxt       dc.b ' or HEX: '
  549. hex1       dc.b 'FFFF',$a
  550.        cnop 0,2
  551.  
  552. f1length   dc.l 0
  553. file1       ds.b 80     file names
  554. f2length   dc.l 0
  555. file2       ds.b 80
  556.  
  557. Inst       ds.b 80
  558.  
  559. BufNum2    dc.l 0
  560. Buffer2    ds.b 80
  561. align2       ds.b 1
  562. Out1       ds.b 9
  563. OutBuf       ds.b 69
  564. Out2       ds.b 131
  565.  
  566. ; Communication structure
  567.  
  568. Begin       ds.l 1         Begin of disassembly
  569. RelAddr    ds.l 1         Relative address
  570. Micro       ds.w 1         Microprocessor type
  571. OpCode       ds.w 1         Opcode translation
  572. Type1       ds.w 1         Type of 1st operand
  573. Len1       ds.w 1         Length of 1st address
  574. Addr1       ds.l 1         1st address
  575. Type2       ds.w 1         Type of 2nd operand
  576. Len2       ds.w 1         Length of 2nd operand
  577. Addr2       ds.l 1         2nd address
  578. Total       ds.w 1         Total no of bytes
  579. Buffer       ds.b 40         Output buffer
  580.  
  581. dosname    dc.b 'dos.library',0
  582.        cnop 0,2
  583.  
  584. window       dc.b 'CON:0/0/639/199/Compare files',0
  585.        cnop 0,2
  586.  
  587. INF       dc.b 'First file: ',0
  588. INFE       cnop 0,2
  589.  
  590. OUTF       dc.b 'Second file: ',0
  591. OUTE       cnop 0,2
  592.  
  593.        end
  594.  
  595.